import axios from 'axios'
import store from '../../src/store/index'
import router from '../../src/router'
import global from '@/../static/global.vue'
// axios.defaults.withCredentials=true;
// 设置请求超时10秒
axios.defaults.timeout = 30000
// 响应拦截器
var cookie = {
  set: function(key, val, time) { // 设置cookie方法
    var date = new Date() // 获取当前时间
    var expiresHours = time // 将date设置为n小时以后的时间
    date.setTime(date.getTime() + expiresHours * 3600 * 1000) // 格式化为cookie识别的时间
    document.cookie = key + '=' + val + ';expires=' + date.toGMTString() // 设置cookie
  },
  get: function(key) { // 获取cookie方法
    /* 获取cookie参数*/
    var getCookie = document.cookie.replace(/[ ]/g, '') // 获取cookie，并且将获得的cookie格式化，去掉空格字符
    var arrCookie = getCookie.split(';') // 将获得的cookie以"分号"为标识 将cookie保存到arrCookie的数组中
    var tips // 声明变量tips
    for (var i = 0; i < arrCookie.length; i++) { // 使用for循环查找cookie中的tips变量
      var arr = arrCookie[i].split('=') // 将单条cookie用"等号"为标识，将单条cookie保存为arr数组
      if (key == arr[0]) { // 匹配变量名称，其中arr[0]是指的cookie名称，如果该条变量为tips则执行判断语句中的赋值操作
        tips = arr[1] // 将cookie的值赋给变量tips
        break // 终止for循环遍历
      }
    }
    return tips
  }
}
// http request 拦截器
axios.interceptors.request.use(
  config => {
    if (cookie.get('token')) { // 判断是否存在token，如果存在的话，则每个http header都加上token
      config.headers.token = `${cookie.get('token')}`
    }
    return config
  },
  err => {
    return Promise.reject(err)
  })
axios.interceptors.response.use(
  response => {
    // 如果返回状态码为200，接口请求成功，正常拿到数据
    // 否则，抛出错误
    if (response.status === 200) {
      store.commit('hideLoading') // 报错关闭loading组件
      if (response.data.code == '401') { // 超时跳到登录页
        cookie.set('token', '', -1)
        window.location.href = global.verifyUrl + '/?ReturnUrl=' + window.location.href
      }
      return Promise.resolve(response)
    } else {
      store.commit('hideLoading') // 报错关闭loading组件
      return Promise.reject(response)
    }
  },

  // 返回状态码不是2开头的情况
  error => {
    store.commit('hideLoading') // 报错关闭loading组件
    if (error.response) {
      switch (error.response.status) {
        case 404:
          this.$message.error('页面不存在！')
          break
        default:
          this.$message.error(error.message)
      }
      return Promise.reject(error.response)
    } else if (error.request) {
      // 请求已经成功发起，但没有收到响应
      // `error.request` 在浏览器中是 XMLHttpRequest 的实例，
      // 而在node.js中是 http.ClientRequest 的实例
      console.log(error.request)
    } else {
      // 发送请求时出了点问题
      console.log('Error', error.message)
    }
    console.log(error.config)
  }
)
/*
* 导出下方函数，代替axios请求数据
* 函数参数如下：
* @params {Object} 请求的参数
* @callback {function} 返回成功执行的方法
* @url {String} 请求的路径
* @method {String} 请求的方法：get,post,delete,put,默认post
* @whichBody {String} 遮罩的作用范围，暂未添加遮罩
*/
export default function(params, callback, url, method, whichBody) {
  store.commit('showLoading')
  const self = this
  if (whichBody == '' || whichBody == undefined) {
    whichBody = 'body'
  }
  if (url == '' || url == undefined) {
    url = sy.bp() + '/json.action'
  }
  if (method == '' || method == undefined) {
    method = 'post'
  }
  axios({
    method: method,
    url: url,
    data: params,
    dataType: 'JSON',
    headers: {
      'Content-type': 'application/json'
    }
  }).then((res) => {
    res = res.data
    if (!res.ret && res.error_message) {
      self.$message.error(res.error_message + '！')
    } else {
      callback(res)
    }
  })
}
